{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Logistic 回归——Pima Indians Diabetes Data Set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据说明：\n",
    "Pima Indians Diabetes Data Set（皮马印第安人糖尿病数据集） 根据现有的医疗信息预测5年内皮马印第安人糖尿病发作的概率。   \n",
    "\n",
    "数据集共9个字段: \n",
    "0列为怀孕次数；\n",
    "1列为口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度；\n",
    "2列为舒张压（单位:mm Hg）\n",
    "3列为三头肌皮褶厚度（单位：mm）\n",
    "4列为餐后血清胰岛素（单位:mm）\n",
    "5列为体重指数（体重（公斤）/ 身高（米）^2）\n",
    "6列为糖尿病家系作用\n",
    "7列为年龄\n",
    "8列为分类变量（0或1）\n",
    "\n",
    "数据链接：https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Target  \n",
       "0                    0.468492  1.425995       1  \n",
       "1                   -0.365061 -0.190672       0  \n",
       "2                    0.604397 -0.105584       1  \n",
       "3                   -0.920763 -1.041549       0  \n",
       "4                    5.484909 -0.020496       1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "train = pd.read_csv(\"FE_pima-indians-diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "pregnants                       768 non-null float64\n",
      "Plasma_glucose_concentration    768 non-null float64\n",
      "blood_pressure                  768 non-null float64\n",
      "Triceps_skin_fold_thickness     768 non-null float64\n",
      "serum_insulin                   768 non-null float64\n",
      "BMI                             768 non-null float64\n",
      "Diabetes_pedigree_function      768 non-null float64\n",
      "Age                             768 non-null float64\n",
      "Target                          768 non-null int64\n",
      "dtypes: float64(8), int64(1)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#  get labels\n",
    "y_train = train['Target']   \n",
    "X_train = train.drop([\"Target\"], axis=1)\n",
    "\n",
    "#用于特征重要性可视化\n",
    "feat_names = X_train.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default Logistic Regression\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [ 0.48797856  0.53011593  0.4562292   0.422546    0.48392885]\n",
      "cv logloss is: 0.476159709444\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print 'logloss of each fold is: ',-loss\n",
    "print'cv logloss is:', -loss.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化的 Logistic Regression及参数调优\n",
    "这部分用交叉验证GridSearchCV、LogisticRegressionCV任意一种方式均可"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "logistic回归的需要调整超参数有：C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "目标函数为：J = C* sum(logloss(f(xi), yi)) +  penalty \n",
    "\n",
    "在sklearn框架下，不同学习器的参数调整步骤相同：\n",
    "设置候选参数集合\n",
    "生成一个GridSearchCV的实例\n",
    "调用GridSearchCV的fit函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.476027502757\n",
      "{'penalty': 'l1', 'C': 1}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/qing/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/qing/anaconda2/lib/python2.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10dc1b690>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = -grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = -grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores =  np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图给出了L1正则和L2正则下、不同正则参数C对应的模型在训练集上测试集上的正确率（score）。可以看出在训练集上C越大（正则越少）的模型性能越好；但在测试集上当C=1时性能最好（L1正则）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 换正确率做评价指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.774739583333\n",
      "{'penalty': 'l2', 'C': 0.1}\n"
     ]
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "\n",
    "#缺省scoring为正确率\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5)\n",
    "grid.fit(X_train,y_train)\n",
    "\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10dc932d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores =  np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "#train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "#train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    #pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuary' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "l2\n",
      "0.1\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_params_['penalty'])\n",
    "print(grid.best_params_['C'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.36167135,  0.99773092, -0.0648661 ,  0.05966521, -0.04513553,\n",
       "         0.54600449,  0.25990383,  0.15544357]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.best_estimator_.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coeffient</th>\n",
       "      <th>columns</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[0.997730916913]</td>\n",
       "      <td>Plasma_glucose_concentration</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[0.54600449107]</td>\n",
       "      <td>BMI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[0.361671351391]</td>\n",
       "      <td>pregnants</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>[0.259903832608]</td>\n",
       "      <td>Diabetes_pedigree_function</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>[0.155443573411]</td>\n",
       "      <td>Age</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[0.0596652097903]</td>\n",
       "      <td>Triceps_skin_fold_thickness</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[-0.0451355310378]</td>\n",
       "      <td>serum_insulin</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[-0.0648660966137]</td>\n",
       "      <td>blood_pressure</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            coeffient                       columns\n",
       "1    [0.997730916913]  Plasma_glucose_concentration\n",
       "5     [0.54600449107]                           BMI\n",
       "0    [0.361671351391]                     pregnants\n",
       "6    [0.259903832608]    Diabetes_pedigree_function\n",
       "7    [0.155443573411]                           Age\n",
       "3   [0.0596652097903]   Triceps_skin_fold_thickness\n",
       "4  [-0.0451355310378]                 serum_insulin\n",
       "2  [-0.0648660966137]                blood_pressure"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"coeffient\":list(grid.best_estimator_.coef_.T)})\n",
    "df.sort_values(by=['coeffient'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
